import json

from rest_framework.decorators import api_view, authentication_classes
from .. import utils
from ..models import User
from .. import serializers
from ..serializers import UserSerializer,LoginLogSerializer
from ..handler import APIResponse
from ..auth import *
from ..permission import *

@api_view(['POST'])
def login_loads(request):
    # 这是因为 Django 在你访问 request.POST 或 request.GET 之后
    # 已经将原始的请求体数据处理并解析为一个字典
    # 所有之后就没有body了
    print(request.META.get("HTTP_ADMINTOKEN"))
    print('--')
    ret = json.loads(request.body)
    username = ret['username']['_value']
    password = ret['password']['_value']

    password = utils.md5value(password) # 生成md5加密的password

    users = User.objects.filter(username=username, password=password, role__in=['1', '3'])
    # users = User.objects.filter(username=username)
    if len(users) > 0:
        user = users[0]
        # print(user)
        data = {
            'username': username,
            'password': password,
            'admin_token': utils.md5value(username)  # 生成令牌
        }
        # data 包含要序列化的所有数据
        # 这个方法会调用 user 对象的 save() 方法
        # 将 user对象持久化到数据库。如果你在 UserSerializer 的 Meta 类中指定了 update 方法
        # 那么 serializer.save() 将使用 update 方法来更新现有对象。
        serializer = UserSerializer(user, data=data)
        if serializer.is_valid():
            serializer.save() # 这个是没有必要的
        #     # make_login_log(request)
            return APIResponse(code=0, msg='登录成功', data=serializer.data)
        else:
            print(serializer.errors)

    return APIResponse(code=1, msg='用户名或密码错误')

@api_view(['POST'])
def login(request):
    username = request.data['username']
    password = utils.md5value(request.data['password']) # 生成md5加密的password

    # role 这个字段是[1,3]中的一个
    users = User.objects.filter(username=username, password=password, role__in=['1', '3'])
    if len(users) > 0:
        user = users[0]
        data = {
            'username': username,
            'password': password,
            'admin_token': utils.md5value(username)  # 生成令牌
        }
        # 这个方法会调用 user 对象的 save() 方法
        # 将 user对象持久化到数据库。如果你在 UserSerializer 的 Meta 类中指定了 update 方法
        # 那么 serializer.save() 将使用 update 方法来更新现有对象。
        # data 包含要序列化的所有数据
        # 使用User模型进行保存，使用data进行数据填充
        # 虽然使用User模型进行保存,
        serializer = UserSerializer(user, data=data)
        # 通过数据库中定义的字段的属性进行验证
        # 如果已经创建已经在数据库中的用户，不需要进行save
        # 这这里进行判断是否是合法的是有必要的，判断前端传来的数据是否是符合规定的
        if serializer.is_valid():
            # serializer.save()
            make_login_log(request)
            return APIResponse(code=0, msg='登录成功', data=serializer.data)
        else:
            print(serializer.errors)

    return APIResponse(code=1, msg='用户名或密码错误')


# 验证账号类型，并返回相应的权限信息，让前端识别并处理要不要显示数据
@api_view(['POST'])
@authentication_classes([AdminTokenAuthtication])
def create(request):
    print('create')
    if isDemoAdminUser(request):
        return APIResponse(code=1, msg='演示帐号无法操作')

    print(request.data)
    if not request.data.get('username', None) or not request.data.get('password', None):
        return APIResponse(code=1, msg='用户名或密码不能为空')
    users = User.objects.filter(username=request.data['username'])
    if len(users) > 0:
        return APIResponse(code=1, msg='该用户名已存在')

    data = request.data.copy()
    data.update({'password': utils.md5value(request.data['password'])})
    serializer = UserSerializer(data=data)
    if serializer.is_valid():
        serializer.save()
        return APIResponse(code=0, msg='创建成功', data=serializer.data)
    else:
        print(serializer.errors)

    return APIResponse(code=1, msg='创建失败')


@api_view(['GET'])
def list(request):
    if request.method == 'GET':
        keyword = request.GET.get("keyword", '')
        users = User.objects.filter(username__contains=keyword).order_by('-create_time')
        serializer = UserSerializer(users, many=True)
        return APIResponse(code=0, msg='查询成功', data=serializer.data)


@api_view(['POST'])
@authentication_classes([AdminTokenAuthtication])
def update(request):
    if isDemoAdminUser(request):
        return APIResponse(code=1, msg='演示帐号无法操作')

    try:
        pk = request.GET.get('id', -1)
        user = User.objects.get(pk=pk)
    except User.DoesNotExist:
        return APIResponse(code=1, msg='对象不存在')

    data = request.data.copy()
    if 'username' in data.keys():
        del data['username']
    if 'password' in data.keys():
        del data['password']
    serializer = UserSerializer(user, data=data)
    print(serializer.is_valid())
    if serializer.is_valid():
        serializer.save()
        return APIResponse(code=0, msg='更新成功', data=serializer.data)
    else:
        print(serializer.errors)
    return APIResponse(code=1, msg='更新失败')


def make_login_log(request):
    try:
        username = request.data['username']
        data = {
            "username": username,
            "ip": utils.get_ip(request),
            "ua": utils.get_ua(request) # 获得请求头中的 User-Agent 一般能包含很多信息
        }
        serializer = LoginLogSerializer(data=data)
        if serializer.is_valid():
            serializer.save()
        else:
            print(serializer.errors)
    except Exception as e:
        print(e)